package ar.edu.phm.tp.cuatro.planificacionDsl.interpreter

import ar.edu.phm.tp.cuatro.planificacionDsl.PlanificacionStandaloneSetup
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Asignacion
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Aula
import ar.edu.phm.tp.cuatro.planificacionDsl.planificacion.Model
import java.io.File
import java.util.HashMap
import org.eclipse.emf.common.util.URI
import org.eclipse.xtext.resource.XtextResourceSet
import java.util.Map.Entry

class PlanificacionInterpreter {

	val contadorUsoAulas = new HashMap<Aula, Integer>

	def static void main(String[] args) {
		if (args.isEmpty) {
			throw new RuntimeException(
				"Debe invocar este interprete con la ruta completa a un archivo .plan como argumento!")
		}
		val fileName = args.get(0)
		val model = parsear(fileName)
		new PlanificacionInterpreter().interpret(model)
	}

	def static parsear(String fileName) {
		val injector = new PlanificacionStandaloneSetup().createInjectorAndDoEMFRegistration()
		val resourceSet = injector.getInstance(XtextResourceSet)
		val resource = resourceSet.createResource(URI.createURI(new File(fileName).toURI.toString))
		resource.load(#{})
		return resource.contents.get(0) as Model
	}

	def interpret(Model model) {
		aulaMasUsada(model)
		println("aula mas usada: " + contadorUsoAulas.buscarMaximos.name)
	}

	def void aulaMasUsada(Model model) {
		model.eAllContents.filter(Asignacion).forEach[incrementarContador(it.aula)]
	}

	def Aula buscarMaximos(HashMap<Aula, Integer> map) {
		val entradas = map.entrySet
		val primero = entradas.get(0)

		entradas.fold(primero)[Entry<Aula, Integer> ea, e|if(e.value > ea.value) e else ea].key
	}

	def int obtenerContador(Aula aula) {
		if (!contadorUsoAulas.containsKey(aula))
			contadorUsoAulas.put(aula, 0)
		contadorUsoAulas.get(aula)
	}

	def void incrementarContador(Aula aula) {
		contadorUsoAulas.put(aula, aula.obtenerContador + 1)
	}
}
